/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.apis.view;

import android.app.ListActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

/**
 * A list view example where the data comes from a custom ListAdapter
 */
public class List6 extends ListActivity {

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// Use our own list adapter
		setListAdapter(new SpeechListAdapter(this));
	}

	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		((SpeechListAdapter) getListAdapter()).toggle(position);
	}

	/**
	 * A sample ListAdapter that presents content from arrays of speeches and
	 * text.
	 * 
	 */
	private class SpeechListAdapter extends BaseAdapter {
		public SpeechListAdapter(Context context) {
			mContext = context;
		}

		/**
		 * The number of items in the list is determined by the number of
		 * speeches in our array.
		 * 
		 * @see android.widget.ListAdapter#getCount()
		 */
		public int getCount() {
			return mTitles.length;
		}

		/**
		 * Since the data comes from an array, just returning the index is
		 * sufficent to get at the data. If we were using a more complex data
		 * structure, we would return whatever object represents one row in the
		 * list.
		 * 
		 * @see android.widget.ListAdapter#getItem(int)
		 */
		public Object getItem(int position) {
			return position;
		}

		/**
		 * Use the array index as a unique id.
		 * 
		 * @see android.widget.ListAdapter#getItemId(int)
		 */
		public long getItemId(int position) {
			return position;
		}

		/**
		 * Make a SpeechView to hold each row.
		 * 
		 * @see android.widget.ListAdapter#getView(int, android.view.View,
		 *      android.view.ViewGroup)
		 */
		public View getView(int position, View convertView, ViewGroup parent) {
			SpeechView sv;
			if (convertView == null) {
				sv = new SpeechView(mContext, mTitles[position],
						mDialogue[position], mExpanded[position]);
			} else {
				sv = (SpeechView) convertView;
				sv.setTitle(mTitles[position]);
				sv.setDialogue(mDialogue[position]);
				sv.setExpanded(mExpanded[position]);
			}

			return sv;
		}

		public void toggle(int position) {
			mExpanded[position] = !mExpanded[position];
			notifyDataSetChanged();
		}

		/**
		 * Remember our context so we can use it when constructing views.
		 */
		private Context mContext;

		/**
		 * Our data, part 1.
		 */
		private String[] mTitles = { "Henry IV (1)", "Henry V", "Henry VIII",
				"Richard II", "Richard III", "Merchant of Venice", "Othello",
				"King Lear" };

		/**
		 * Our data, part 2.
		 */
		private String[] mDialogue = {
				"So shaken as we are, so wan with care,"
						+ "Find we a time for frighted peace to pant,"
						+ "And breathe short-winded accents of new broils"
						+ "To be commenced in strands afar remote."
						+ "No more the thirsty entrance of this soil"
						+ "Shall daub her lips with her own children's blood;"
						+ "Nor more shall trenching war channel her fields,"
						+ "Nor bruise her flowerets with the armed hoofs"
						+ "Of hostile paces: those opposed eyes,"
						+ "Which, like the meteors of a troubled heaven,"
						+ "All of one nature, of one substance bred,"
						+ "Did lately meet in the intestine shock"
						+ "And furious close of civil butchery"
						+ "Shall now, in mutual well-beseeming ranks,"
						+ "March all one way and be no more opposed"
						+ "Against acquaintance, kindred and allies:"
						+ "The edge of war, like an ill-sheathed knife,"
						+ "No more shall cut his master. Therefore, friends,"
						+ "As far as to the sepulchre of Christ,"
						+ "Whose soldier now, under whose blessed cross"
						+ "We are impressed and engaged to fight,"
						+ "Forthwith a power of English shall we levy;"
						+ "Whose arms were moulded in their mothers' womb"
						+ "To chase these pagans in those holy fields"
						+ "Over whose acres walk'd those blessed feet"
						+ "Which fourteen hundred years ago were nail'd"
						+ "For our advantage on the bitter cross."
						+ "But this our purpose now is twelve month old,"
						+ "And bootless 'tis to tell you we will go:"
						+ "Therefore we meet not now. Then let me hear"
						+ "Of you, my gentle cousin Westmoreland,"
						+ "What yesternight our council did decree"
						+ "In forwarding this dear expedience.",

				"Hear him but reason in divinity,"
						+ "And all-admiring with an inward wish"
						+ "You would desire the king were made a prelate:"
						+ "Hear him debate of commonwealth affairs,"
						+ "You would say it hath been all in all his study:"
						+ "List his discourse of war, and you shall hear"
						+ "A fearful battle render'd you in music:"
						+ "Turn him to any cause of policy,"
						+ "The Gordian knot of it he will unloose,"
						+ "Familiar as his garter: that, when he speaks,"
						+ "The air, a charter'd libertine, is still,"
						+ "And the mute wonder lurketh in men's ears,"
						+ "To steal his sweet and honey'd sentences;"
						+ "So that the art and practic part of life"
						+ "Must be the mistress to this theoric:"
						+ "Which is a wonder how his grace should glean it,"
						+ "Since his addiction was to courses vain,"
						+ "His companies unletter'd, rude and shallow,"
						+ "His hours fill'd up with riots, banquets, sports,"
						+ "And never noted in him any study,"
						+ "Any retirement, any sequestration"
						+ "From open haunts and popularity.",

				"I come no more to make you laugh: things now,"
						+ "That bear a weighty and a serious brow,"
						+ "Sad, high, and working, full of state and woe,"
						+ "Such noble scenes as draw the eye to flow,"
						+ "We now present. Those that can pity, here"
						+ "May, if they think it well, let fall a tear;"
						+ "The subject will deserve it. Such as give"
						+ "Their money out of hope they may believe,"
						+ "May here find truth too. Those that come to see"
						+ "Only a show or two, and so agree"
						+ "The play may pass, if they be still and willing,"
						+ "I'll undertake may see away their shilling"
						+ "Richly in two short hours. Only they"
						+ "That come to hear a merry bawdy play,"
						+ "A noise of targets, or to see a fellow"
						+ "In a long motley coat guarded with yellow,"
						+ "Will be deceived; for, gentle hearers, know,"
						+ "To rank our chosen truth with such a show"
						+ "As fool and fight is, beside forfeiting"
						+ "Our own brains, and the opinion that we bring,"
						+ "To make that only true we now intend,"
						+ "Will leave us never an understanding friend."
						+ "Therefore, for goodness' sake, and as you are known"
						+ "The first and happiest hearers of the town,"
						+ "Be sad, as we would make ye: think ye see"
						+ "The very persons of our noble story"
						+ "As they were living; think you see them great,"
						+ "And follow'd with the general throng and sweat"
						+ "Of thousand friends; then in a moment, see"
						+ "How soon this mightiness meets misery:"
						+ "And, if you can be merry then, I'll say"
						+ "A man may weep upon his wedding-day.",

				"First, heaven be the record to my speech!"
						+ "In the devotion of a subject's love,"
						+ "Tendering the precious safety of my prince,"
						+ "And free from other misbegotten hate,"
						+ "Come I appellant to this princely presence."
						+ "Now, Thomas Mowbray, do I turn to thee,"
						+ "And mark my greeting well; for what I speak"
						+ "My body shall make good upon this earth,"
						+ "Or my divine soul answer it in heaven."
						+ "Thou art a traitor and a miscreant,"
						+ "Too good to be so and too bad to live,"
						+ "Since the more fair and crystal is the sky,"
						+ "The uglier seem the clouds that in it fly."
						+ "Once more, the more to aggravate the note,"
						+ "With a foul traitor's name stuff I thy throat;"
						+ "And wish, so please my sovereign, ere I move,"
						+ "What my tongue speaks my right drawn sword may prove.",

				"Now is the winter of our discontent"
						+ "Made glorious summer by this sun of York;"
						+ "And all the clouds that lour'd upon our house"
						+ "In the deep bosom of the ocean buried."
						+ "Now are our brows bound with victorious wreaths;"
						+ "Our bruised arms hung up for monuments;"
						+ "Our stern alarums changed to merry meetings,"
						+ "Our dreadful marches to delightful measures."
						+ "Grim-visaged war hath smooth'd his wrinkled front;"
						+ "And now, instead of mounting barded steeds"
						+ "To fright the souls of fearful adversaries,"
						+ "He capers nimbly in a lady's chamber"
						+ "To the lascivious pleasing of a lute."
						+ "But I, that am not shaped for sportive tricks,"
						+ "Nor made to court an amorous looking-glass;"
						+ "I, that am rudely stamp'd, and want love's majesty"
						+ "To strut before a wanton ambling nymph;"
						+ "I, that am curtail'd of this fair proportion,"
						+ "Cheated of feature by dissembling nature,"
						+ "Deformed, unfinish'd, sent before my time"
						+ "Into this breathing world, scarce half made up,"
						+ "And that so lamely and unfashionable"
						+ "That dogs bark at me as I halt by them;"
						+ "Why, I, in this weak piping time of peace,"
						+ "Have no delight to pass away the time,"
						+ "Unless to spy my shadow in the sun"
						+ "And descant on mine own deformity:"
						+ "And therefore, since I cannot prove a lover,"
						+ "To entertain these fair well-spoken days,"
						+ "I am determined to prove a villain"
						+ "And hate the idle pleasures of these days."
						+ "Plots have I laid, inductions dangerous,"
						+ "By drunken prophecies, libels and dreams,"
						+ "To set my brother Clarence and the king"
						+ "In deadly hate the one against the other:"
						+ "And if King Edward be as true and just"
						+ "As I am subtle, false and treacherous,"
						+ "This day should Clarence closely be mew'd up,"
						+ "About a prophecy, which says that 'G'"
						+ "Of Edward's heirs the murderer shall be."
						+ "Dive, thoughts, down to my soul: here"
						+ "Clarence comes.",

				"To bait fish withal: if it will feed nothing else,"
						+ "it will feed my revenge. He hath disgraced me, and"
						+ "hindered me half a million; laughed at my losses,"
						+ "mocked at my gains, scorned my nation, thwarted my"
						+ "bargains, cooled my friends, heated mine"
						+ "enemies; and what's his reason? I am a Jew. Hath"
						+ "not a Jew eyes? hath not a Jew hands, organs,"
						+ "dimensions, senses, affections, passions? fed with"
						+ "the same food, hurt with the same weapons, subject"
						+ "to the same diseases, healed by the same means,"
						+ "warmed and cooled by the same winter and summer, as"
						+ "a Christian is? If you prick us, do we not bleed?"
						+ "if you tickle us, do we not laugh? if you poison"
						+ "us, do we not die? and if you wrong us, shall we not"
						+ "revenge? If we are like you in the rest, we will"
						+ "resemble you in that. If a Jew wrong a Christian,"
						+ "what is his humility? Revenge. If a Christian"
						+ "wrong a Jew, what should his sufferance be by"
						+ "Christian example? Why, revenge. The villany you"
						+ "teach me, I will execute, and it shall go hard but I"
						+ "will better the instruction.",

				"Virtue! a fig! 'tis in ourselves that we are thus"
						+ "or thus. Our bodies are our gardens, to the which"
						+ "our wills are gardeners: so that if we will plant"
						+ "nettles, or sow lettuce, set hyssop and weed up"
						+ "thyme, supply it with one gender of herbs, or"
						+ "distract it with many, either to have it sterile"
						+ "with idleness, or manured with industry, why, the"
						+ "power and corrigible authority of this lies in our"
						+ "wills. If the balance of our lives had not one"
						+ "scale of reason to poise another of sensuality, the"
						+ "blood and baseness of our natures would conduct us"
						+ "to most preposterous conclusions: but we have"
						+ "reason to cool our raging motions, our carnal"
						+ "stings, our unbitted lusts, whereof I take this that"
						+ "you call love to be a sect or scion.",

				"Blow, winds, and crack your cheeks! rage! blow!"
						+ "You cataracts and hurricanoes, spout"
						+ "Till you have drench'd our steeples, drown'd the cocks!"
						+ "You sulphurous and thought-executing fires,"
						+ "Vaunt-couriers to oak-cleaving thunderbolts,"
						+ "Singe my white head! And thou, all-shaking thunder,"
						+ "Smite flat the thick rotundity o' the world!"
						+ "Crack nature's moulds, an germens spill at once,"
						+ "That make ingrateful man!" };

		/**
		 * Our data, part 3.
		 */
		private boolean[] mExpanded = { false, false, false, false, false,
				false, false, false };
	}

	/**
	 * We will use a SpeechView to display each speech. It's just a LinearLayout
	 * with two text fields.
	 * 
	 */
	private class SpeechView extends LinearLayout {
		public SpeechView(Context context, String title, String dialogue,
				boolean expanded) {
			super(context);

			this.setOrientation(VERTICAL);

			// Here we build the child views in code. They could also have
			// been specified in an XML file.

			mTitle = new TextView(context);
			mTitle.setText(title);
			addView(mTitle, new LinearLayout.LayoutParams(
					LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

			mDialogue = new TextView(context);
			mDialogue.setText(dialogue);
			addView(mDialogue, new LinearLayout.LayoutParams(
					LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

			mDialogue.setVisibility(expanded ? VISIBLE : GONE);
		}

		/**
		 * Convenience method to set the title of a SpeechView
		 */
		public void setTitle(String title) {
			mTitle.setText(title);
		}

		/**
		 * Convenience method to set the dialogue of a SpeechView
		 */
		public void setDialogue(String words) {
			mDialogue.setText(words);
		}

		/**
		 * Convenience method to expand or hide the dialogue
		 */
		public void setExpanded(boolean expanded) {
			mDialogue.setVisibility(expanded ? VISIBLE : GONE);
		}

		private TextView mTitle;
		private TextView mDialogue;
	}
}
